import rest_framework.serializers as serializers
import serializer06.models as models

#普通的序列化方法
class RolesSerializer(serializers.Serializer): #定义序列化类
    id=serializers.IntegerField()  #定义需要提取的序列化字段,名称和model中定义的字段相同
    name=serializers.CharField()


#带有多对多的映射方法
class UserinfoSerializer_Many2Many(serializers.Serializer):
    id=serializers.IntegerField()
    user_name=serializers.CharField()
    password=serializers.CharField()

    gp=serializers.CharField(source='group.name') #本质拿到group对象，取对象的name,
    custom = serializers.SerializerMethodField()  # 多对多序列化方法一

    def get_custom(self, obj):  # 名称固定：get_定义的字段名称
        roles = obj.roles.all().values()  # 获取所有的角色
        return list(roles)  # 返回的结果一定有道是json可序列化的对象



#自定义的字段显示
class UserinfoSerializer_Custom(serializers.ModelSerializer):
    rl=serializers.SerializerMethodField()
    # 1、自定义字段名称，和数据模型不一致，需要指定source本质调用get_user_type_display()方法获取数据
    # 2、 model中使用choice后，获取属性可以使用get_字段_display，指定自定义字段
    custom = serializers.CharField(source='get_user_type_display')

    # 3、和model的属性对应，如果字段名一致，则获取配置
    # custom2 =serializers.CharField(source="user_name_vip")

    def get_rl(self,obj):
        roles=obj.roles.all().values()
        return list(roles)

    #4、如果不修改model，可以利用SerializerMethodField进行控制
    user_name = serializers.SerializerMethodField()
    def get_user_name(self, obj):
        return obj.user_name+"_svip"

    class Meta:
        model = models.UserInfo
        fields = ['id', 'user_name', 'password','custom',"user_name_vip", 'rl'] #配置要序列化的字段
        # fields = "__all__" 使用model中所有的字段


#深度控制
class UserinfoSerializer_Depth(serializers.ModelSerializer):

    class Meta:
        model = models.UserInfo
        fields = ['id', 'username', 'password', 'group','roles']  # 配置要序列化的字段
        depth = 1  #系列化深度，1~10，建议使用不超过3



#超链接
class UserinfoSerializer_Hyper(serializers.ModelSerializer):
    id = serializers.IntegerField()
    # view_name，urls.py目标url的视图别名（name），这里是UserGroup的视图别名
    # lookup_field 给url传递的参数，也就是正则匹配的字段
    # lookup_url_kwarg，url中正则名称，也就是kwargs中的key
    group = serializers.HyperlinkedIdentityField(view_name='gp', lookup_field='group_id', lookup_url_kwarg='xxx')

    class Meta:
        model = models.UserInfo
        fields = ['id', 'user_name', 'password', 'roles', 'group']  # 配置要序列化的字段
        depth = 1  # 系列化深度，1~10，建议使用不超过3



#超链接方法显示
class UserGroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserGroup
        fields = "__all__"
        depth = 0



